/*
 * @Author: wwssaabb
 * @Date: 2021-12-16 10:18:02
 * @LastEditTime: 2021-12-16 12:01:43
 * @FilePath: \handwritten-code\main\观察者模式.js
 */



/* 
  观察者模式，和发布订阅模式的区别是观察者和订阅者强耦合
  指多个对象间存在一对多的依赖关系， 当一个对象的状态发生改变时， 所有依赖于它的对象都得到通知并被自动更新
*/


//观察者
class Observer {
  constructor(cb) {
    // this.cb = cb
  }
  update() {
    console.log('进行更新')
    //进行更新的回调
    // this.cb()
  }
}

//目标对象
class Subject {
  constructor() {
    //缓存订阅的观察者列表
    this.observers = []
  }

  //添加观察者
  add(ob) {
    this.observers.push(ob)
  }

  //通知观察者更新
  notify() {
    this.observers.forEach(ob => ob.update())
  }
}


const ob1 = new Observer()
const ob2 = new Observer()
const ob3 = new Observer()
const ob4 = new Observer()

const sub = new Subject()

//ob订阅sub
sub.add(ob1)
sub.add(ob2)
sub.add(ob3)
sub.add(ob4)
//sub更新
sub.notify()
